1

HTTP(Hypertext Transfer Protocol),是一个标准,定义了web客户端如何与服务器对话,以及数据如何从服务器传回客户端。

HTTP协议指定客户端与服务器如何建立连接、客户端如何从服务器请求数据,服务器如何响应请求,以及最后如何关闭连接。HTTP连接使用TCP/IP来传输数据,对于从客户端到服务器的每一个请求,都有4个步骤:

1)默认情况下,客户端在端口80打开与服务器的一个TCP连接,URL中还可以指定其他端口

2)客户端向服务器发送消息,请求指定路径上的资源。这个请求包括一个首部,可选地还可以有一个空行,后面是这个请求的数据

3)服务器向客户端发送响应,响应以响应码开头,后面是包含元数据的首部,一个空行以及所请求的文档或错误信息

4)服务器关闭连接。

HTTP1.1及以后的版本,可以通过一个TCP连接连续发送多个请求和响应(也就是第2步和第3步可以反复多次)。

GET /index.html HTTP/1.1 (请求行,包括一个方法、资源路径、http版本)

User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:20.0) 

 Gecko/20100101 Firefox/20.0 告诉服务器使用的是什么浏览器,好让服务器发送为特定浏览器准备的优化文件

Host: en.wikipedia.org

Connection: keep-alive

Accept-Language: en-US,en;q=0.5  

Accept-Encoding: gzip, deflate  

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8  告诉服务器客户端可以处理哪些数据类型

(\r\n\r\n空行告诉服务器结束)

每个请求和响应都有同样的基本形式,一个首部行,一个包含元数据的HTTP首部,一个空行,然后是一个消息体。

MIME类型分为两级:类型和子类型。比如text/html,text是类型,html是子类型,再比如image/jpeg,image是类型,jpeg是子类型。

服务器响应:

HTTP/1.1 200 OK  (服务器使用HTTP1.1协议,响应码为200 OK)

Date: Sun, 21 Apr 2013 15:12:46 GMT

Server: Apache

Connection: close

Content-Type: text/html; charset=ISO-8859-1  (MIME)

Content-length: 115

<html>

<head>

<title>

A Sample HTML file

</title>

</head>

<body>

The rest of the document goes here

</body>

</html>

响应码的100-199表示一个提供信息的响应,200-299表示成功,300-399表示重定向,400-499表示一个客户端错误,500-599表示一个服务器错误。

HTTP1.0会为每个请求打开一个新连接,实际上,一个典型web会话中打开和关闭所有连接所花费的时间远远大于实际传输数据的时间,特别是有很多小文档的会话。对于使用SSL或TLS的加密HTTPS连接,这个问题尤其严重,因为建立一个安全socket的握手过程比建立常规socket需要做更多的工作。

HTTP1.1和以后版本,服务器不必在发送响应后就关闭连接,可以保持连接打开,在同一个socket上等待客户端的请求。可以在一个TCP连接上连续发送多个请求和响应。不过,服务器响应之后,客户端请求的锁步模式还是一样的。

通过在请求首部,增加

Connection: Keep-Alive表示它希望重用一个socket,URL类透明地支持HTTP Keep-Alive,除非显式地关闭这个特性。也就是说,在服务器关闭连接之前,如果再次连接到同一个服务器,就会重用socket。

cookie可以设置HttpOnly属性,告诉浏览器只通过http和https返回cookie,特别强调不能由JavaScript返回。


codecraft
11.9k 声望2k 粉丝

当一个代码的工匠回首往事时,不因虚度年华而悔恨,也不因碌碌无为而羞愧,这样,当他老的时候,可以很自豪告诉世人,我曾经将代码注入生命去打造互联网的浪潮之巅,那是个很疯狂的时代,我在一波波的浪潮上留下...